1 module hunt.cache.manger; 2 import hunt.cache.ucache; 3 4 class CacheManger 5 { 6 UCache createCache( string cacheName , string driverName = "memory" ,string args = "" , bool enableL2Cache = false) 7 { 8 synchronized(this) 9 { 10 if(getCache(cacheName)){ 11 return null; 12 } 13 14 auto ucache = UCache.CreateUCache(driverName , args , enableL2Cache); 15 _mapCaches[cacheName] = ucache; 16 return ucache; 17 } 18 } 19 20 string[] getAllCacheNames() 21 { 22 synchronized(this){ 23 return _mapCaches.keys; 24 } 25 } 26 27 UCache getCache(string cacheName) 28 { 29 synchronized(this){ 30 UCache *ucache = cacheName in _mapCaches; 31 if(ucache == null) 32 return null; 33 else 34 return *ucache; 35 } 36 } 37 38 void destroyCache(string cacheName) 39 { 40 synchronized(this){ 41 _mapCaches.remove(cacheName); 42 } 43 } 44 45 private: 46 UCache[string] _mapCaches; 47 } 48 49 50 unittest{ 51 52 import core.thread; 53 import std.algorithm; 54 import std.stdio; 55 56 57 CacheManger manger = new CacheManger(); 58 59 //test manger. 60 string[] allkeys = ["memory" , "memory_l2"]; 61 62 auto memory = manger.createCache(allkeys[0]); 63 auto memory_l2 = manger.createCache(allkeys[1] , "memory" , "" , true); 64 65 version(SUPPORT_REDIS) 66 { 67 allkeys ~= ["redis" ,"redis_l2"]; 68 69 auto redis = manger.createCache(allkeys[$ - 2] , "redis" , "127.0.0.1:6379"); 70 auto redis_l2 = manger.createCache(allkeys[$ - 1] , "redis" , "127.0.0.1:6379" , true); 71 } 72 73 version(SUPPORT_MEMCACHED) 74 { 75 allkeys ~= ["memcached" , "memcached_l2"]; 76 auto memcached = manger.createCache(allkeys[$ - 2] , "memcached" , "--SERVER=127.0.0.1:11211" ); 77 auto memcached_l2 = manger.createCache(allkeys[$ -1] , "memcached" , "--SERVER=127.0.0.1:11211" , true); 78 } 79 80 version(SUPPORT_ROCKSDB) 81 { 82 allkeys ~= ["rocksdb" , "rocksdb_l2"]; 83 auto rocksdb = manger.createCache(allkeys[$ - 2] , "rocksdb" , "/tmp/test1"); 84 auto rocksdb_l2 = manger.createCache(allkeys[$ -1] , "rocksdb" , "/tmp/test2" , true); 85 } 86 87 88 auto names = manger.getAllCacheNames(); 89 names.sort; 90 allkeys.sort; 91 assert(allkeys.length == names.length); 92 93 void test(UCache cache) 94 { 95 cache.put("key1" ,"value1" , 1); 96 string[string] map = ["key2":"value2" , "key3":"value3"]; 97 cache.putAll(map); 98 99 string value = cache.get("key1"); 100 assert(value == "value1"); 101 assert(cache.containsKey("key2")); 102 assert(!cache.putifAbsent("key1" , "value11")); 103 auto kvs = cache.getall(["key2" , "key3"]); 104 foreach(k,v ; kvs) 105 { 106 assert(map[k] == v.origin); 107 } 108 109 assert(cache.remove("key2")); 110 assert(!cache.containsKey("key2")); 111 Thread.sleep(dur!"seconds"(2)); 112 assert(!cache.containsKey("key1")); 113 assert(cache.putifAbsent("key1" , "value11")); 114 cache.clear(); 115 assert(!cache.containsKey("key3")); 116 } 117 118 foreach(k ; allkeys) 119 { 120 import std.stdio; 121 writeln("test " ,k); 122 123 test(manger.getCache(k)); 124 } 125 126 foreach(k ; allkeys) 127 manger.destroyCache(k); 128 129 assert(manger.getAllCacheNames().length == 0); 130 131 }